<?php


namespace app\back\model;

use \Exception;
use think\facade\Db;
use \think\response\Json;

class AdminModel
{
    private static $_table = 'admin'; // 管理员表
    private static $_roleTable = 'role'; // 管理员表
    private static $_menuTable = 'menu'; // 菜单表

    /**检测权限
     * @param $adminId
     * @param $url
     * @return bool|Json
     */
    public static function checkAuth($adminId, $url)
    {
        try {
            $info = self::getInfo($adminId);
            if (!is_array($info)) return $info;
            $menuId = Db::table(self::$_menuTable)->where('api', $url)->where('level', 2)->value('id');
            if (!$menuId) return jsonFail('未找到可用的权限');
            $menu_ids = explode(',', $info['left_menu_ids']);
            if (!in_array($menuId, $menu_ids)) return jsonFail('您没有权限操作!');
            return $info;
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**后台登录
     * @param array $input
     * @return Json
     */
    public static function login($input)
    {
        try {
            $info = Db::table(self::$_table)->field('id,password,status,valid')->where('account', $input['account'])->find();
            if (!$info) return jsonFail('未找到管理员信息');
            if (sha1($input['password']) !== $info['password']) return jsonFail('密码不正确');
            if ($info['status'] != 1) return jsonFail('您被禁用，请联系上级管理员');
            if ($info['valid'] != 1) return jsonFail('您被删除，请联系上级管理员');
            $rtn = makeToken('sxc', 'admin-' . $info['id']);
            if ($rtn == false) return jsonFail('生成登录态失败');
            // 修改本次登录信息
            $map[] = ['id', '=', $info['id']];
            $update = [
                'last_login_time' => time(),
                'last_login_ip' => $input['ip'],
                'login_times' => Db::raw('login_times + 1')
            ];
            $res = Db::table(self::$_table)->where($map)->update($update);
            if ($res) return jsonSuccess('登录成功', $rtn);
            return jsonSuccess('登录失败', $rtn);
        } catch (Exception $e) {
            return jsonFail($e->getMessage());
        }
    }


    /**获取管理员信息
     * @param $adminId
     * @return mixed
     */
    private static function getInfo($adminId)
    {
        try {
            $info = Db::table(self::$_table)->alias('a')
                ->join([self::$_roleTable => 'r'], 'a.role_id = r.id')
                ->field('a.id,a.name,a.path as admin_path,last_login_ip,last_login_time,login_times,a.status as admin_status,a.valid as admin_valid,a.level as admin_level,a.role_id,r.level as role_level,r.path as role_path,r.status as role_status,r.valid as role_valid,menu_ids,left_menu_ids,version')
                ->where('a.id', $adminId)
                ->find();
            if (!$info) return jsonFail('未找到管理员信息');
            if (1 != $info['admin_status']) return jsonFail('当前管理员不可用，请联系上级管理员');
            if (1 != $info['admin_valid']) return jsonFail('当前管理员已删除，请联系上级管理员');
            if (1 != $info['role_status']) return jsonFail('当前角色不可用,请联系上级管理员');
            if (1 != $info['role_valid']) return jsonFail('当前角色已删除,请联系上级管理员');
            return $info;
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }


    /**获取权限树以及个人信息
     * @param $info
     * @return Json
     */
    public static function getMenus($info)
    {
        try {
            $info = self::getInfo($info['id']);
            if (!is_array($info)) return $info;
            $map[] = ['id', 'in', $info['left_menu_ids']];
            $menuList = Db::table(self::$_menuTable)->field('id,pid,name,icon,router,component')->where($map)->order('sort', 'asc')->select()->toArray();
            return jsonSuccess('获取成功', ['info' => $info, 'menus' => getTree($menuList)]);
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**获取管理员列表
     * @param $input
     * @param $info
     * @return Json
     */
    public static function getAdminList($input, $info)
    {
        try {
            $map = [
                ['a.pid', '=', $info['id']]
            ];
            if ($input['status'] !== '') {
                $map[] = ['a.status', '=', $input['status']];
            } else {
                $map[] = ['a.status', 'in', [1, 2]];
            }
            if ($input['name'] !== '') $map[] = ['a.name', 'like', "%{$input['name']}%"];
            $field = 'a.id,a.name,a.status,a.create_time,r.name as role_name,gender,phone';
            $table = Db::table(self::$_table)->alias('a')
                ->join([self::$_roleTable => 'r'], 'r.id = a.role_id')
                ->where($map)->field($field);
            $count = $table->count();
            if ($count == 0) return jsonSuccess('暂无数据', ['count' => 0, 'list' => []]);
            $list = $table->page($input['page'], $input['limit'])->order('create_time', 'desc')->select()->toArray();
            return jsonSuccess('获取成功', ['count' => $count, 'list' => $list]);
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }


    /**获取管理员简单列表
     * @param $input
     * @param $info
     * @return Json
     */
    public static function getAdminSimple($info)
    {
        $rtn = self::getAdminSimpleStatic($info);
        if (is_array($rtn)) return jsonSuccess('获取成功', $rtn);
        return $rtn;
    }

    public static function getAdminSimpleStatic($info)
    {
        try {
            $map = [
                ['pid', '=', $info['id']],
                ['status', '=', 1]
            ];
            $rtn = Db::table(self::$_table)->field('id,name')->where($map)->select()->toArray();
            if (!$rtn) return jsonFail('无可用的管理员');
            return $rtn;
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**添加管理员
     * @param $input
     * @param $info
     * @return Json
     */
    public static function addAdmin($input, $info)
    {
        try {
            // 查询账号和手机是否被注册
            $map1 = [
                ['account', '=', $input['account']]
            ];
            $map2 = [
                ['phone', '=', $input['phone']]
            ];
            $adminInfo = Db::table(self::$_table)->field('account,phone')->whereOr([$map1, $map2])->find();
            if ($adminInfo['account'] == $input['account']) return jsonFail('该账号已被注册');
            if ($adminInfo['phone'] == $input['phone']) return jsonFail('该手机号已被使用');
            $input['password'] = sha1($input['password']);
            unset($input['addpassword']);
            $input['pid'] = $info['id'];
            $input['level'] = $info['admin_level'] + 1;
            $input['path'] = $info['admin_path'] . $info['id'] . '-';
            $input['last_login_time'] = 0;
            $input['last_login_ip'] = 0;
            $input['login_times'] = 0;
            $input['create_time'] = time();
            $rtn = Db::table(self::$_table)->insert($input);
            if ($rtn === 1) return jsonSuccess('添加成功');
            return jsonFail('添加失败');
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**修改管理员状态
     * @param $input
     * @param $info
     * @return Json
     */
    public static function changeAdminStatus($input, $info)
    {
        try {
            // 获取当前信息
            $adminInfo = Db::table(self::$_table)->field('path,pid,status')->where('id', $input['id'])->find();
            if (!$adminInfo) return jsonFail('未找到管理员信息');
            if ($adminInfo['pid'] != $info['id']) return jsonFail('该管理员非您直接管理，您没有权限操作');
            if ($adminInfo['status'] == 3) return jsonFail('该管理员已删除无法继续操作');
            // 根据不同status执行不同操作
            $update = [
                'status' => $input['status']
            ];
            switch ($input['status']) {
                case 1:
                    // 启用管理员
                    $map[] = ['id', '=', $input['id']];
                    $map[] = ['status', '=', 2];
                    $rtn = Db::table(self::$_table)->where($map)->update($update);
                    if ($rtn) return jsonSuccess('操作成功');
                    break;
                case 2:
                    // 联级禁用管理员
                    $rtn = Db::table(self::$_table)->whereRaw('`status` = 1 AND (`id` = :id OR path LIKE :path)', ['id' => $input['id'], 'path' => "{$adminInfo['path']}{$input['id']}-%"])->update($update);
                    if ($rtn) return jsonSuccess('操作成功');
                    break;
                default:
                    return jsonFail('不可用的状态');
            }
            return jsonFail('操作失败');
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**删除管理员
     * @param $input
     * @param $info
     * @return Json
     */
    public static function delAdmin($input, $info)
    {
        try {
            // 获取当前信息
            $adminInfo = Db::table(self::$_table)->field('path,pid,status')->where('id', $input['id'])->find();
            if (!$adminInfo) return jsonFail('未找到管理员信息');
            if ($adminInfo['pid'] != $info['id']) return jsonFail('该管理员非您直接管理，您没有权限操作');
            if ($adminInfo['status'] == 3) return jsonFail('该管理员已删除无法继续操作');
            $update = [
                'status' => 3
            ];
            // 联级删除管理员
            $rtn = Db::table(self::$_table)->whereRaw('`status` IN (1,2) AND (`id` = :id OR path LIKE :path)', ['id' => $input['id'], 'path' => "{$adminInfo['path']}{$input['id']}-%"])->update($update);
            if ($rtn) return jsonSuccess('操作成功');

            return jsonFail('操作失败');
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**获取单个管理员信息
     * @param $input
     * @param $info
     * @return Json
     */
    public static function getAdminOnly($input, $info)
    {
        try {
            // 获取当前信息
            $adminInfo = Db::table(self::$_table)->field('id,pid,status,name,account,phone,role_id,gender')->where('id', $input['id'])->find();
            if (!$adminInfo) return jsonFail('未找到管理员信息');
            if ($adminInfo['pid'] != $info['id']) return jsonFail('该管理员非您直接管理，您没有权限操作');
            if ($adminInfo['status'] == 3) return jsonFail('该管理员已删除无法继续操作');
            $roleList = RoleModel::getAdminRoleStatic($info);
            if (!is_array($roleList)) return $roleList;
            unset($adminInfo['pid']);
            unset($adminInfo['status']);
            return jsonSuccess('获取成功', ['info' => $adminInfo, 'roleList' => $roleList]);
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**编辑管理员信息
     * @param $input
     * @param $info
     * @return Json
     */
    public static function editAdmin($input, $info)
    {
        try {
            // 获取当前信息
            $adminInfo = Db::table(self::$_table)->field('id,pid,status')->where('id', $input['id'])->find();
            if (!$adminInfo) return jsonFail('未找到管理员信息');
            if ($adminInfo['pid'] != $info['id']) return jsonFail('该管理员非您直接管理，您没有权限操作');
            if ($adminInfo['status'] == 3) return jsonFail('该管理员已删除无法继续操作');
            $rtn = Db::table(self::$_table)->update($input);
            if ($rtn) return jsonSuccess('编辑成功');
            return jsonFail('数据无变化，编辑失败');
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**强制修改管理员密码
     * @param $input
     * @param $info
     * @return Json
     */
    public static function forceAdminPwd($input, $info)
    {
        try {
            // 获取当前信息
            $adminInfo = Db::table(self::$_table)->field('id,pid,status')->where('id', $input['id'])->find();
            if (!$adminInfo) return jsonFail('未找到管理员信息');
            if ($adminInfo['pid'] != $info['id']) return jsonFail('该管理员非您直接管理，您没有权限操作');
            if ($adminInfo['status'] == 3) return jsonFail('该管理员已删除无法继续操作');
            unset($input['forpassword']);
            $input['password'] = sha1($input['password']);
            $rtn = Db::table(self::$_table)->update($input);
            if ($rtn) return jsonSuccess('修改成功');
            return jsonFail('修改前后密码一致无需修改');
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }
}